computersfandomcom_he-20200214-history
שפת C/פלט וקלט
פלט וקלט הם מהרכיבים הבסיסיים בכל תוכנה, ומאפשרים קשר בין המשתמש לבין התוכנה. ה''פלט'' מאפשר לתוכנית להוציא מידע אל המשתמש, וה''קלט'' מאפשר לתוכנה לקלוט מידע שמוכנס על ידי המשתמש. כפי שראינו בשורה 1 של שלום עולם!.}} פונקציית הפלט printf אחת הפונקציות החשובות ביותר בשפת C היא printf, המאפשרת להדפיס הודעות על מסך המחשב לפי תבנית (format בלעז) נתונה (ומכאן שמה, print format). הדפסת הודעות קבועות printf מאפשרת להדפיס הודעות קבועות (כפי שכבר ראינו). לדוגמה, כדי להציג hello world, אפשר לכתוב: printf("Hello world"); שהוא התו ירידת שורה (כלומר, סיום השורה הנוכחית ומעבר לשורה חדשה). לדוגמה, הקריאה הבאה: printf("Hello world\n"); תדפיס את המלל ותעבור לשורה חדשה. }} הדפסת ערכים בעזרת מציינים printf מאפשרת גם להדפיס ערכי משתנים. לדוגמה, אם x הוא משתנה מטיפוס שלם, אז קטע הקוד הבא: printf("the value is %d", x); ידפיס the value is ולאחריו הערך בx. כלומר, רצף התווים משמעו כאן מציין שיש להדפיס ערך מטיפוס שלם. אם רוצים להדפיס ערך שאינו דווקא מטיפוס שלם, יש להחליף את רצף התווים ברצף שמתאים לטיפוס: *c% עבור טיפוסים מסוג char *f% עבור טיפוסים מסוג float *lf% עבור טיפוסים מסוג double *e% כדי להדפיס מספרים בתצוגת נקודה צפה, כלומר 1000 יודפס כ-1e3, ו- 0.001 יודפס 1e-3, וכן הלאה. נוח לעבודה עם מספרים גדולים או קטנים במיוחד. *s% עבור מחרוזות (שטרם למדנו בנקודה זו) *p% עבור מצביעים (שטרם למדנו בנקודה זו) הפונקציה printf אף מאפשרת להדפיס יותר מערך יחיד. להדפסת שני ערכים, לדוגמה, אפשר לכתוב: printf("the values are %d %d", x, y); דגלים, קובעי רוחב ודיוק עד עתה השתמשנו במציינים כך: % כאשר specifier הוא מציין הטיפוס. כעת נראה כיצד לשלוט בצורה מדוייקת יותר בפלט. קובעי רוחב לפני המציין, אפשר אופציונאלית לכתוב גם קובע רוחב, כך: %width כאשר specifier הוא המציין, וwidth הוא קובע הרוחב. אם width הוא מספר, אז הדפסת הערך תיקח לכל הפחות width תווים. לדוגמה: printf("%10d", 3) תדפיס: 3 כך מאפיינים גם רוחב הדפסה למחרוזות. לדוגמה: printf("%10s", "ׁHello") תדפיס: Hello קובעי דיוק לפני המציין, אפשר אופציונאלית לכתוב גם קובע דיוק, כך: %.precision כאשר specifier הוא המציין, וprecision הוא קובע הדיוק. אם precision הוא מספר, אז דיוק המספר יהיה בדיוק precision תווים. לדוגמה: printf("%.3f\n", 3.14159265); printf("%.3f\n", 3.1); ידפיסו: 3.142 3.100 אפשר להפעיל זאת גם על מחרוזות. לדוגמה: printf("%.3s\n", "Hello"); תדפיס: Hel אפשר להשתמש בו זמנית בקובעי רוחב ודיוק, בצורה: %width.precision במקרה כזה, קודם יופעל קובע הדיוק, ולאחריו קובע הרוחב. לדוגמה: printf("%10.3f\n", 3.14159265); printf("%10.3f\n", 3.1); printf("%10.3s\n", "Hello"); ידפיסו: 3.142 3.100 Hel דגלים לפני המציין, אפשר אופציונאלית לכתוב גם דגלים, כך: %flags כאשר flags הם דגלים, וspecifier הוא מציין. הדגלים הם: אפשר להשתמש בו זמנית בדגלים, קובעים, ומציינים, בצורה הבאה: %flagswidth.precision פונקציות הקלט scanf בת זוגה של printf היא scanf, המאפשרת לקלוט ערכים לפי פורמט נתון. קליטת ערכים בעזרת מציינים לאחר שמצהירים על משתנה, אפשר לקלוט ערכים לתוכו. לדוגמה: int x; scanf("%d", &x); כאשר התוכנית תגיע לשורה זו, היא תמתין עד שהמשתמש יקליד מספר וילחץ Enter. המספר ייקלט למשתנה x. באותו האופן, נוכל לקלוט מספר משתנים מסוגים שונים: int number; char first_letter; int phone; printf("Please enter a number, first character of your name, and your phone number:\n"); scanf("%d %c %d", &x, &first_letter, &phone); בדוגמה זו יקבל המשתמש בקשה לכתוב מספר, תו משמו ואת מספר הטלפון שלו. לאחר שיזין פרטים אלה, הם ייקלטו במשתנים. קובעי רוחב לפני המציין, אפשר אופציונאלית לכתוב גם קובע רוחב, כך: %width כאשר specifier הוא המציין, וwidth הוא קובע הרוחב. אם width הוא מספר, אז ייקלטו לכל היותר width תווים. לדוגמה: scanf("%3d", &num) תקלוט לכל היותר 3 תווים. כך מאפיינים גם רוחב קליטה למחרוזות. לדוגמה: char a5; scanf("%4s", a); תקלוט לכל היותר 4 תווים למחרוזת a. קליטת מחרוזות קבועות נניח שאנו רוצים לקלוט שני מספרים, כל אחד בעל 5 ספרות. נוכל לכתוב זאת כך: int x, y; scanf("%5d %5d", &x, &y); נשים לב שיקלטו שני מספרים שביניהם רווח אחד או יותר. עתה נניח שאנו רוצים לקלוט שני מספרים, כל אחד בעל 5 ספרות, מופרדים על ידי פסיק. נוכל לכתוב זאת כך: int x, y; scanf("%5d,%5d", &x, &y); כלומר, צריך לשים פסיק במחרוזת התבנית. אם המשתמש אכן יקליד שני מספרים מופרדים על ידי פסיקים, ייקלטו המספרים בx וy, והפונקציה תחזיר 2. אם לא, הפוקנציה תחזיר מספר קטן מ2. נוכל להכליל זאת: *אם מופיע תו שאינו רווח במחרוזת התבנית, הקלט ימשיך רק אם המשתמשת תקליד תו זה בדיוק. *הפונקציה scanf מחזירה את מספר המשתנים שהצליחה לקלוט. פונקציות פלט/קלט נוספות אם כי הפונקציות printf וscanf הן השימושיות ביותר, ישנן עוד פונקציות לקלט ופלט: *בפלט וקלט קבצים נראה פונקציות לקריאה וכתיבה לקבצים. *בפלט וקלט מחרוזות נראה פונקציות לפלט וקלט מחרוזות. *הספריה הסטנדרטית כוללת פונקציות נוספות לקלט ופלט. פלט וקלט